package com.jyw.common.annotation;



import com.jyw.common.enums.ConversionType;

import java.lang.annotation.*;


/**
 * 试例请参考: ConversionUtilTest
 * 转换注解
 * 如果在类上加入@OpenAutoConversion标签,返回参数如果是该类/该类的集合/该类的数组/该类的分页对象,将会自动进行转换
 * 手动调用: ConversionUtil.conversion
 *
 * ***注意****
 * "自动解析" 后的对象<默认>将会转换成 LinkedHashMap<FieldName, value>的形式返回,
 * 如果想要返回相应的实体类,需要修改OpenAutoConversion标签的value值,即 @OpenAutoConversion(value = Someone.class)
 *
 * 加上转换标签的内容<默认>将会额外增加 一个 (FieldName + "ToName") 的字段
 * 例如: 我在 user 上加入了一个转换标签, 那么返回的LinkedHashMap中, 就会额外存在一个 userToName 的 key
 *
 * ----0.1.1更新----
 * 1、新增自定义名称, 例: @Conversion(name = "newName"), 如果不指定newName的值, 默认为 {sourceName} + ToName
 * 2、现在手动转换支持回传对象了(吐血, 为啥给自己找罪受...), 例: T newObject = ConversionUtil.conversion(obj, T.class)
 *
 * ----0.1.2更新----
 * 1.现在自动转换支持返回实体类,很好解决了加上自动转换后 timestamp 后置解析失效的问题
 *
 * plan 1:
 * 1、支持自动转换, 比如:
 *
 * -@Conversion
 * private List<Integer> userId;  // 数据源: {1, 2, 3}
 * private String userIdToName;   // 转换后 "张三, 李四, 王五" (=>目前版本会直接报错)
 *
 * -@Conversion(makeType = ConversionMakeType.KEY_VALUE)
 * private List<Integer> userId;  // 数据源: {1, 2, 3}
 * private String userIdToName;   // 转换后 {"1" : "张三", "2" : "李四", "3" : "王五"} (=>目前版本会直接报错)
 *
 * 2、支持对源数据的隐藏
 *
 * -@Conversion(show = false, name = "user")
 * private List<Integer> user;  // 数据源: {1, 2, 3} => {"张三"、 "李四"、 "王五"}
 *
 * 3、ConversionUtil.conversion 支持 List<Map<String, Object>> 格式
 *
 * @author 伍绍宇
 */
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Conversion {
    /**
     * 需要转换的参数类型
     */
    ConversionType value() default ConversionType.USER;

    /**
     * 字典类型
     */
    String dictType() default "";

    /**
     * 更改后的字段名称
     */
    String name() default "";
}
